package com.zh.onlineexam.config;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.redisson.config.ReadMode;
import org.redisson.config.SubscriptionMode;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.List;

/**
 * @author 29934
 * redisson 配置属性
 */
@Data
@ConfigurationProperties(prefix = "redisson")
public class RedissonProperties {
    /** 线程池数量，默认值 = 当前处理核数量 * 2 */
    private int threads;
    /** Netty线程池数量,默认值 = 当前处理核数量 * 2 */
    private int nettyThreads;
    /** 单机服务配置 */
    private SingleServerConfig singleServerConfig;
    /** 集群服务配置 */
    private ClusterServersConfig clusterServersConfig;
    /** 缓存组 */
    private List<CacheGroup> cacheGroup;

    @Data
    @NoArgsConstructor
    public static class SingleServerConfig {
        /** 客户端名称 */
        private String clientName;
        /** 最小空闲连接数 */
        private int connectionMinimumIdleSize;
        /** 连接池大小 */
        private int connectionPoolSize;
        /** 连接空闲超时，单位：毫秒 */
        private int idleConnectionTimeout;
        /** 命令等待超时，单位：毫秒 */
        private int timeout;
        /** 发布和订阅连接池大小 */
        private int subscriptionConnectionPoolSize;
    }

    @Data
    @NoArgsConstructor
    public static class ClusterServersConfig {
        /** 客户端名称 */
        private String clientName;
        /** master最小空闲连接数 */
        private int masterConnectionMinimumIdleSize;
        /** master连接池大小 */
        private int masterConnectionPoolSize;
        /** slave最小空闲连接数 */
        private int slaveConnectionMinimumIdleSize;
        /** slave连接池大小 */
        private int slaveConnectionPoolSize;
        /** 连接空闲超时，单位：毫秒 */
        private int idleConnectionTimeout;
        /** 命令等待超时，单位：毫秒 */
        private int timeout;
        /** 发布和订阅连接池大小 */
        private int subscriptionConnectionPoolSize;
        /** 读取模式 */
        private ReadMode readMode;
        /** 订阅模式 */
        private SubscriptionMode subscriptionMode;
    }

    @Data
    @NoArgsConstructor
    public static class CacheGroup {
        /** 组id */
        private String groupId;
        /** 组过期时间 */
        private long ttl;
        /** 组最大空闲时间 */
        private long maxIdleTime;
        /** 组最大长度 */
        private int maxSize;
    }
}
